/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.discovery.broker.messages;

import java.io.IOException;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.log4j.Logger;

import cgl.narada.util.ObjectMarshaller;
import cgl.narada.util.UUIDRetriever;

/**
 * Created on Mar 26, 2005
 * 
 * @author Harshawardhan Gadgil (hgadgil@grids.ucs.indiana.edu)
 */

public class BrokerDiscoveryRequest implements Serializable {

    static Logger    log = Logger.getLogger("BrokerDiscoveryRequest");

    /** Unique id for this request */
    private String   requestUUID;

    /** Hostname of client */
    private String   hostname;

    /** UDP port of client where the response must be sent */
    private int      port;

    /**
     * List of protocols the broker MUST support E.g. tcp, udp, rtp etc...
     * Useful for matching a suitable broker from list of available brokers.
     */
    private String[] transportProtocols;

    /** Only brokers of following networks may reply */
    private String   belongingToNetwork;

    /** For future USE */
    // TODO: Use Certificates HERE
    private String   securityCredentials;

    public BrokerDiscoveryRequest() {
        // AUTOFill this entry, don't rely on programmers :)
        requestUUID = (UUIDRetriever.getInstance()).getTimeBasedUUIDAsString();

        try {
            hostname = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            System.out.println("ERROR: " + e);
            hostname = "localhost";
        }
    }

    /**
     * Marshalls the object into an array of bytes.
     * 
     * @return an array of bytes representing the marshaller object, null if
     *         error occurs
     */
    public byte[] getBytes() {
        try {
            return ObjectMarshaller.marshall(this);
        } catch (IOException e) {
            log.error("", e);
            return null;
        }

    }

    /**
     * Unmarshalls the bytes as a BrokerDiscoveryRequest object
     * 
     * @param objectBytes
     * @return BrokerDiscoveryRequest if successful, null if error occurs
     */
    public static BrokerDiscoveryRequest createObjectFromBytes(
            byte[] objectBytes) {
        try {
            return (BrokerDiscoveryRequest) ObjectMarshaller
                    .unmarshall(objectBytes);
        } catch (IOException e) {
            log.error("", e);
        } catch (ClassNotFoundException e) {
            log.error("", e);
        }
        return null;
    }

    /**
     * For debugging purposes
     */
    public String toString() {
        StringBuffer result = new StringBuffer();

        result.append("UUID: " + requestUUID + "\n");
        result.append("HOST: " + hostname + "\n");
        result.append("PORT: " + port + "\n");
        result.append("CRED: " + securityCredentials + "\n");
        result.append("NTWK: " + belongingToNetwork + "\n");
        for (int i = 0; i < transportProtocols.length; i++) {
            result.append("\t-> " + transportProtocols[i]);
        }
        return result.toString();
    }

    /**
     * @return Returns the belongingToNetwork.
     */
    public final String getBelongingToNetwork() {
        return belongingToNetwork;
    }

    /**
     * @param belongingToNetwork
     *            The belongingToNetwork to set.
     */
    public final void setBelongingToNetwork(String belongingToNetwork) {
        this.belongingToNetwork = belongingToNetwork;
    }

    /**
     * @return Returns the hostname.
     */
    public final String getHostname() {
        return hostname;
    }

    /**
     * @param hostname
     *            The hostname to set.
     */
    public final void setHostname(String hostname) {
        this.hostname = hostname;
    }

    /**
     * @return Returns the port.
     */
    public final int getPort() {
        return port;
    }

    /**
     * @param port
     *            The port to set.
     */
    public final void setPort(int port) {
        this.port = port;
    }

    /**
     * @return Returns the securityCredentials.
     */
    public final String getSecurityCredentials() {
        return securityCredentials;
    }

    /**
     * @param securityCredentials
     *            The securityCredentials to set.
     */
    public final void setSecurityCredentials(String securityCredentials) {
        this.securityCredentials = securityCredentials;
    }

    /**
     * @return Returns the transportProtocols.
     */
    public final String[] getTransportProtocols() {
        return transportProtocols;
    }

    /**
     * @param transportProtocols
     *            The transportProtocols to set.
     */
    public final void setTransportProtocols(String[] transportProtocols) {
        this.transportProtocols = transportProtocols;
    }

    /**
     * @return Returns the requestUUID.
     */
    public final String getRequestUUID() {
        return requestUUID;
    }
}